package br.com.controlador;

import br.com.modelo.Caixa;
import br.com.modelo.Cidade;
import br.com.modelo.Cliente;
import java.io.Serializable;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import util.Biblioteca;
import util.JPAUtil;
import util.JSFUtil;
import util.Utilitario;

/**
 *
 * @author gilberto.costa
 */
@ManagedBean
@ViewScoped
public class ClienteControler implements Serializable {

    private Cliente cliente;
    private List<Cliente> listCliente = new ArrayList<Cliente>();
    private List<Cidade> listCidades = new ArrayList<Cidade>();
    private String campoBusca;
    private Boolean validouCpfCnpj = false;
    private Boolean alterando = false;

    @PostConstruct
    public void init() {
        setCliente(new Cliente());
        listCliente = Cliente.retornaClientes();
    }

    /**
     * @return the cliente
     */
    public Cliente getCliente() {
        return cliente;
    }

    /**
     * @param cliente the cliente to set
     */
    public void setCliente(Cliente cliente) {
        alterando = true;
        listCidades = Cidade.retornaCidadeDoEstado(cliente.getIdCidade().getEstado());
        this.cliente = cliente;
    }

    /**
     * @return the lisCliente
     */
    public List<Cliente> getListCliente() {
        return listCliente;
    }

    /**
     * @param lisCliente the lisCliente to set
     */
    public void setListCliente(List<Cliente> listCliente) {
        this.listCliente = listCliente;
    }

    /**
     * @return the campoBusca
     */
    public String getCampoBusca() {
        return campoBusca;
    }

    /**
     * @param campoBusca the campoBusca to set
     */
    public void setCampoBusca(String campoBusca) {
        this.campoBusca = campoBusca;
    }

    public void inicializaObj() {
        alterando = false;
        cliente = new Cliente();
    }

    public void alterar() {
        alterando = false;
    }

    public void salvar() {
        try {
            if (Biblioteca.validaCpfCnpj(cliente.getCpfCnpj().replace(".", "").replace("/", "").replace("-", ""))) {
                //removendo a mascara
                cliente.setFone1(Utilitario.removeCaracterdeUmaString(getCliente().getFone1()));
                cliente.setFone2(Utilitario.removeCaracterdeUmaString(getCliente().getFone2()));
                cliente.setCelular(Utilitario.removeCaracterdeUmaString(getCliente().getCelular()));
                cliente.setCep(Utilitario.removeCaracterdeUmaString(getCliente().getCep()));
                cliente.setCpfCnpj(Utilitario.removeCaracterdeUmaString(getCliente().getCpfCnpj()));
                cliente.setNome(getCliente().getNome().toUpperCase());//colocando o nome em maisculo
                if (getCliente().getTipoPessoa().toString().equalsIgnoreCase("J")) {
                    cliente.setInscricaoEstadual(Utilitario.removeCaracterdeUmaString(getCliente().getInscricaoEstadual()));
                    cliente.setFantasia(getCliente().getFantasia().toUpperCase());//colocando o nome em maisculo
                }
                if (cliente.getDataCadastro() == null) {
                    cliente.setDataCadastro(new Date());
                }
                //cidade
                Cidade cid = Cidade.retornaCidadePorId(cliente.getIdCidade().getId());
                cliente.setCidade(cid.getCidade());
                cliente.setUf(cid.getEstado());
                cliente.setCodigoIbgeCidade(Integer.parseInt(cid.getCodIBGE()));
                cliente.setCodigoIbgeUf(Integer.parseInt(cid.getCodIBGE().substring(0, 2)));
                cliente = cliente.salvar();
                listCliente = Cliente.retornaClientes();
                JSFUtil.addMessageSucesso("Cliente salvo!!");

                //retornando caixas e salvando nos caixas
                List<Caixa> caixa = CaixaControler.retornaCaixa();
                for (Caixa c : caixa) {
                    Connection con = JPAUtil.conectaBanco(c.getIp());
                    if (con != null) {
                        cliente = cliente.salvarCaixas(c.getIp());
                        JSFUtil.addMessageSucesso("Transferido para caixa(" + c.getNome() + ")");
                    }
                }
                org.primefaces.context.RequestContext.getCurrentInstance().execute("dlgCliente.hide();");
            } else {
                JSFUtil.addMessageValidacao("O CPF ou CNPJ informado é invalido!!");
            }
        } catch (Exception e) {
            JSFUtil.addMessageErro("Problema ao cadastrar o funcionário!!" + e);
        }
    }

    public void excluir() {
        try {
            cliente.setExcluido('S');
            cliente = cliente.salvar();
            listCliente = Cliente.retornaClientes();
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Cliente excluido!!", "Mensagem"));
            //retornando caixas e salvando nos caixas
            List<Caixa> caixa = CaixaControler.retornaCaixa();
            for (Caixa c : caixa) {
                Connection con = JPAUtil.conectaBanco(c.getIp());
                if (con != null) {
                    cliente = cliente.salvarCaixas(c.getIp());
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Transferido para caixa(" + c.getNome() + ")", "Mensagem"));
                }
            }
            org.primefaces.context.RequestContext.getCurrentInstance().execute("dlgCliente.hide();");
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Erro ao excluir cliente!!" + e, "Mensagem"));
        }
    }

    public void validaCpfCnpj() {
        validouCpfCnpj = Biblioteca.validaCpfCnpj(cliente.getCpfCnpj().replace(".", "").replace("/", "").replace("-", ""));
        if (!validouCpfCnpj) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "O CPF ou CNPJ informado é invalido!!", "Mensagem"));
        }
    }

    public List<String> retornaEstados() {
        return Cidade.retornEstados();
    }

    public void carregaCidades() {
        listCidades = Cidade.retornaCidadeDoEstado(cliente.getIdCidade().getEstado());
    }

    public void realizaBusca() {
        listCliente = Cliente.retornaBusca(campoBusca);
    }

    public void inicializaBusca() {
        campoBusca = new String();
    }

    /**
     * @return the validouCpfCnpj
     */
    public Boolean getValidouCpfCnpj() {
        return validouCpfCnpj;
    }

    /**
     * @param validouCpfCnpj the validouCpfCnpj to set
     */
    public void setValidouCpfCnpj(Boolean validouCpfCnpj) {
        this.validouCpfCnpj = validouCpfCnpj;
    }

    /**
     * @return the listCidades
     */
    public List<Cidade> getListCidades() {
        return listCidades;
    }

    /**
     * @param listCidades the listCidades to set
     */
    public void setListCidades(List<Cidade> listCidades) {
        this.listCidades = listCidades;
    }

    public Boolean getAlterando() {
        return alterando;
    }

    public void setAlterando(Boolean alterando) {
        this.alterando = alterando;
    }
}
